/**
  ******************************************************************************
  * @file    usb_desc.c
  * @author  MCD Application Team
  * @version V4.1.0
  * @date    26-May-2017
  * @brief   Descriptors for Custom HID Demo
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
  *
  * Redistribution and use in source and binary forms, with or without modification,
  * are permitted provided that the following conditions are met:
  *   1. Redistributions of source code must retain the above copyright notice,
  *      this list of conditions and the following disclaimer.
  *   2. Redistributions in binary form must reproduce the above copyright notice,
  *      this list of conditions and the following disclaimer in the documentation
  *      and/or other materials provided with the distribution.
  *   3. Neither the name of STMicroelectronics nor the names of its contributors
  *      may be used to endorse or promote products derived from this software
  *      without specific prior written permission.
  *
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  ******************************************************************************
  */


/* Includes ------------------------------------------------------------------*/
#include "usb_lib.h"
#include "usb_desc.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Extern variables ----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/* USB Standard Device Descriptor */
const uint8_t CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC] =
  {
    CUSTOMHID_SIZ_DEVICE_DESC,  /*bLength */
    0x01,                       /*bDescriptorType*/
    0x00,                       /*bcdUSB */
    0x02,
    0x00,                       /*bDeviceClass*/
    0x00,                       /*bDeviceSubClass*/
    0x00,                       /*bDeviceProtocol*/
    0x40,                       /*bMaxPacketSize40*/
//    0x83,                       /*idVendor (0x0483)*/
//    0x04,
//    0x50,                       /*idProduct = 0x5750*/
//    0x57,
    0x16,                       /*idVendor (0x0416)*/
    0x04,
    0x87,                       /*idProduct = 0x7687*/
    0x76,
    0x01,                       /*bcdDevice rel. 2.00*/
    0x01,
    1,                          /*Index of string descriptor describing manufacturer */
    2,                          /*Index of string descriptor describing product*/
    3,                          /*Index of string descriptor describing the device serial number */
    0x01                        /*bNumConfigurations*/
  }
  ; /* CustomHID_DeviceDescriptor */


/* USB Configuration Descriptor */
/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
//const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =
//  {
//    0x09, /* bLength: Configuration Descriptor size */
//    0x02, /* bDescriptorType: Configuration */
//    CUSTOMHID_SIZ_CONFIG_DESC,
//    /* wTotalLength: Bytes returned */
//    0x00,
//    0x01,         /* bNumInterfaces: 1 interface */
//    0x01,         /* bConfigurationValue: Configuration value */
//    0x00,         /* iConfiguration: Index of string descriptor describing
//                                 the configuration*/
//    0xC0,         /* bmAttributes: Self powered */
//    0x32,         /* MaxPower 100 mA: this current is used for detecting Vbus */

//    /************** Descriptor of Custom HID interface ****************/
//    /* 09 */
//    0x09,         /* bLength: Interface Descriptor size */
//    0x04,/* bDescriptorType: Interface descriptor type */
//    0x00,         /* bInterfaceNumber: Number of Interface */
//    0x00,         /* bAlternateSetting: Alternate setting */
//    0x02,         /* bNumEndpoints */
//    0x03,         /* bInterfaceClass: HID */
//    0x00,         /* bInterfaceSubClass : 1=BOOT, 0=no boot */
//    0x00,         /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
//    0,            /* iInterface: Index of string descriptor */
//    /******************** Descriptor of Custom HID HID ********************/
//    /* 18 */
//    0x09,         /* bLength: HID Descriptor size */
//    0x21, /* bDescriptorType: HID */
//    0x10,         /* bcdHID: HID Class Spec release number */
//    0x01,
//    0x00,         /* bCountryCode: Hardware target country */
//    0x01,         /* bNumDescriptors: Number of HID class descriptors to follow */
//    0x22,         /* bDescriptorType */
//    CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */
//    0x00,
//    /******************** Descriptor of Custom HID endpoints ******************/
//    /* 27 */
//    0x07,          /* bLength: Endpoint Descriptor size */
//    0x05,          /* bDescriptorType: */

//    0x81,          /* bEndpointAddress: Endpoint Address (IN) */
//    0x03,          /* bmAttributes: Interrupt endpoint */
//    0x40,          /* wMaxPacketSize: 2 Bytes max */
//    0x00,
//    0x20,          /* bInterval: Polling Interval (32 ms) */
//    /* 34 */
//    	
//    0x07,	/* bLength: Endpoint Descriptor size */
//    0x05,	/* bDescriptorType: Endpoint descriptor type */
//    0x01,	/* bEndpointAddress: Endpoint Address (OUT) */
//    0x03,	/* bmAttributes: Interrupt endpoint */
//    0x40,	/* wMaxPacketSize: 2 Bytes max  */
//    0x00,
//    0x20,	/* bInterval: Polling Interval (20 ms) */
//    /* 41 */
//  }; /* CustomHID_ConfigDescriptor */
//  
const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =
{
	0x09,			                    // bLength
	0x02,	                            // bDescriptorType
	CUSTOMHID_SIZ_CONFIG_DESC & 0xFF,   // wTotalLength
    CUSTOMHID_SIZ_CONFIG_DESC >> 8,	    
	0x01, 								// bNumInterfaces
	0x01,               				// bConfigurationValue
	0x00,               				// iConfiguration
	0xC0,               				// bmAttributes, D6: self power  D5: remote wake-up
	0x64,               				// MaxPower, 100 * 2mA = 200mA
	// 9
	// I/F descriptor: HID
	0x09,      		                    // bLength
	0x04,		                        // bDescriptorType
	0x00,               				// bInterfaceNumber
	0x00,               				// bAlternateSetting
	0x02,               				// bNumEndpoints    
	0x03,               				// bInterfaceClass
	0x00,               				// bInterfaceSubClass
	0x00,               				// bInterfaceProtocol
	0x00,//0x05,               				// iInterface
    // 18

	// HID Descriptor
	0x09,            					// bLength
	0x21,					            // bDescriptorType
	0x00,          				        // HID Class Spec
    0x01,
	0x00,               				// H/W target country.
	0x01,               				// Number of HID class descriptors to follow.
	0x22,				                // Descriptor type.
	CUSTOMHID_SIZ_REPORT_DESC&0xff, CUSTOMHID_SIZ_REPORT_DESC>>8,  // Total length of report descriptor.
    // 27
    
	// CMSIS-DAP v2 WinUSB 要求第一个端点是 Bulk OUT，第二个端点是 Bulk IN
	// EP Descriptor: interrupt out.
	0x07,             	// bLength
	0x05,		        // bDescriptorType
	0x02,			    // bEndpointAddress    
	0x03,				// bmAttributes
	0x40, 0x00,			// wMaxPacketSize
	1,					// bInterval
	//34
    
	// EP Descriptor: interrupt in.
	0x07,				// bLength
	0x05,		        // bDescriptorType
	0x81,				// bEndpointAddress
	0x03,				// bmAttributes
	0x40, 0x00,			// wMaxPacketSize
	1,					// bInterval
    // 41
};
  
	#if 0
const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
  {                    
    0x06, 0xFF, 0x00,      /* USAGE_PAGE (Vendor Page: 0xFF00) */                       
    0x09, 0x01,            /* USAGE (Demo Kit)               */    
    0xa1, 0x01,            /* COLLECTION (Application)       */            
    /* 6 */
    
    /* Led 1 */        
    0x85, 0x01,            /*     REPORT_ID (1)		     */
    0x09, 0x01,            /*     USAGE (LED 1)	             */
    0x15, 0x00,            /*     LOGICAL_MINIMUM (0)        */          
    0x25, 0x01,            /*     LOGICAL_MAXIMUM (1)        */           
    0x75, 0x08,            /*     REPORT_SIZE (8)            */        
    0x95, 0x01,            /*     REPORT_COUNT (1)           */       
    0xB1, 0x82,             /*    FEATURE (Data,Var,Abs,Vol) */     

    0x85, 0x01,            /*     REPORT_ID (1)              */
    0x09, 0x01,            /*     USAGE (LED 1)              */
    0x91, 0x82,            /*     OUTPUT (Data,Var,Abs,Vol)  */
    /* 26 */
    
    /* Led 2 */
    0x85, 0x02,            /*     REPORT_ID 2		     */
    0x09, 0x02,            /*     USAGE (LED 2)	             */
    0x15, 0x00,            /*     LOGICAL_MINIMUM (0)        */          
    0x25, 0x01,            /*     LOGICAL_MAXIMUM (1)        */           
    0x75, 0x08,            /*     REPORT_SIZE (8)            */        
    0x95, 0x01,            /*     REPORT_COUNT (1)           */       
    0xB1, 0x82,             /*    FEATURE (Data,Var,Abs,Vol) */     

    0x85, 0x02,            /*     REPORT_ID (2)              */
    0x09, 0x02,            /*     USAGE (LED 2)              */
    0x91, 0x82,            /*     OUTPUT (Data,Var,Abs,Vol)  */
    /* 46 */
    
    /* Led 3 */        
    0x85, 0x03,            /*     REPORT_ID (3)		     */
    0x09, 0x03,            /*     USAGE (LED 3)	             */
    0x15, 0x00,            /*     LOGICAL_MINIMUM (0)        */          
    0x25, 0x01,            /*     LOGICAL_MAXIMUM (1)        */           
    0x75, 0x08,            /*     REPORT_SIZE (8)            */        
    0x95, 0x01,            /*     REPORT_COUNT (1)           */       
    0xB1, 0x82,             /*    FEATURE (Data,Var,Abs,Vol) */     

    0x85, 0x03,            /*     REPORT_ID (3)              */
    0x09, 0x03,            /*     USAGE (LED 3)              */
    0x91, 0x82,            /*     OUTPUT (Data,Var,Abs,Vol)  */
    /* 66 */
    
    /* Led 4 */
    0x85, 0x04,            /*     REPORT_ID 4)		     */
    0x09, 0x04,            /*     USAGE (LED 4)	             */
    0x15, 0x00,            /*     LOGICAL_MINIMUM (0)        */          
    0x25, 0x01,            /*     LOGICAL_MAXIMUM (1)        */           
    0x75, 0x08,            /*     REPORT_SIZE (8)            */        
    0x95, 0x01,            /*     REPORT_COUNT (1)           */       
    0xB1, 0x82,            /*     FEATURE (Data,Var,Abs,Vol) */     

    0x85, 0x04,            /*     REPORT_ID (4)              */
    0x09, 0x04,            /*     USAGE (LED 4)              */
    0x91, 0x82,            /*     OUTPUT (Data,Var,Abs,Vol)  */
    /* 86 */
    
    /* key Push Button */  
    0x85, 0x05,            /*     REPORT_ID (5)              */
    0x09, 0x05,            /*     USAGE (Push Button)        */      
    0x15, 0x00,            /*     LOGICAL_MINIMUM (0)        */      
    0x25, 0x01,            /*     LOGICAL_MAXIMUM (1)        */      
    0x75, 0x01,            /*     REPORT_SIZE (1)            */  
    0x81, 0x82,            /*     INPUT (Data,Var,Abs,Vol)   */   
    
    0x09, 0x05,            /*     USAGE (Push Button)        */               
    0x75, 0x01,            /*     REPORT_SIZE (1)            */           
    0xb1, 0x82,            /*     FEATURE (Data,Var,Abs,Vol) */  
         
    0x75, 0x07,            /*     REPORT_SIZE (7)            */           
    0x81, 0x83,            /*     INPUT (Cnst,Var,Abs,Vol)   */                    
    0x85, 0x05,            /*     REPORT_ID (2)              */         
                    
    0x75, 0x07,            /*     REPORT_SIZE (7)            */           
    0xb1, 0x83,            /*     FEATURE (Cnst,Var,Abs,Vol) */                      
    /* 114 */

    /* Tamper Push Button */  
    0x85, 0x06,            /*     REPORT_ID (6)              */
    0x09, 0x06,            /*     USAGE (Tamper Push Button) */      
    0x15, 0x00,            /*     LOGICAL_MINIMUM (0)        */      
    0x25, 0x01,            /*     LOGICAL_MAXIMUM (1)        */      
    0x75, 0x01,            /*     REPORT_SIZE (1)            */  
    0x81, 0x82,            /*     INPUT (Data,Var,Abs,Vol)   */   
    
    0x09, 0x06,            /*     USAGE (Tamper Push Button) */               
    0x75, 0x01,            /*     REPORT_SIZE (1)            */           
    0xb1, 0x82,            /*     FEATURE (Data,Var,Abs,Vol) */  
         
    0x75, 0x07,            /*     REPORT_SIZE (7)            */           
    0x81, 0x83,            /*     INPUT (Cnst,Var,Abs,Vol)   */                    
    0x85, 0x06,            /*     REPORT_ID (6)              */         
                    
    0x75, 0x07,            /*     REPORT_SIZE (7)            */           
    0xb1, 0x83,            /*     FEATURE (Cnst,Var,Abs,Vol) */  
    /* 142 */
    
    /* ADC IN */
    0x85, 0x07,            /*     REPORT_ID (7)              */         
    0x09, 0x07,            /*     USAGE (ADC IN)             */          
    0x15, 0x00,            /*     LOGICAL_MINIMUM (0)        */               
    0x26, 0xff, 0x00,      /*     LOGICAL_MAXIMUM (255)      */                 
    0x75, 0x08,            /*     REPORT_SIZE (8)            */           
    0x81, 0x82,            /*     INPUT (Data,Var,Abs,Vol)   */                    
    0x85, 0x07,            /*     REPORT_ID (7)              */                 
    0x09, 0x07,            /*     USAGE (ADC in)             */                     
    0xb1, 0x82,            /*     FEATURE (Data,Var,Abs,Vol) */                                 
    /* 161 */

    0xc0 	          /*     END_COLLECTION	             */
  }; /* CustomHID_ReportDescriptor */
#else
const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] ={
//    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
//    0x09, 0x01,                    // USAGE (Joystick)
//    0xa1, 0x01,                    // COLLECTION (Application)
//    
//    //0x05, 0x09,                    //   USAGE_PAGE (Button)
//    //0x19, 0x01,                    //   USAGE_MINIMUM (Button 1)
//    //0x29, 0x08,                    //   USAGE_MAXIMUM (Button 8)
//    0x09, 0x03,                    //   USAGE (Pointer)
//    0x26, 0x00, 0xff,              //   LOGICAL_MAXIMUM (1)
//    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
//    0x75, 0x08,                    //   REPORT_SIZE (1)
//    0x95, 0x40,                    //   REPORT_COUNT (8)
//    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
//    
//    //0x05, 0x01,                    //   USAGE_PAGE (Generic Desktop)
//    0x09, 0x04,                    //   USAGE (Pointer)
//    0x26, 0x00, 0xff,              //   LOGICAL_MAXIMUM (1023)
//    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
//    0x75, 0x08,                    //   REPORT_SIZE (16)
//    0x95, 0x40,                    //   REPORT_COUNT (3)
//    0x91, 0x02,                    //   INPUT (Data,Var,Abs)
//    0xc0                           // END_COLLECTION

//    0x06, 0x00, 0xff,   // Usage Page = 0xFF00 (Vendor Defined Page 1)
//	0x09, 0x01,         // Usage (Vendor Usage 1)
//	0xA1, 0x01,         // Collection (Application)
//    //7
//    0x09, 0x01,         // Usage (Vendor Usage 1)
//    0x15, 0x00,         // Logical Minimum (data bytes in the report may have minimum value = 0x00)
//	0x26, 0xFF, 0x00,   // Logical Maximum (data bytes in the report may have maximum value = 0x00FF = unsigned 255)
//    0x75, 0x08,         // Report Size: 8-bit field size
//    0x95, 0x40,         // Report Count: Make sixty-four 8-bit fields (the next time the parser hits an "Input", "Output", or "Feature" item)
//    0x81, 0x02,         // Input (Data, Array, Abs): Instantiates input packet fields based on the above report size, count, logical min/max, and usage.
//    //20
//    0x09, 0x01,         // Usage (Vendor Usage 1)
//    0x15, 0x00,         // Logical Minimum (data bytes in the report may have minimum value = 0x00)
//    0x26, 0xFF, 0x00,   // Logical Maximum (data bytes in the report may have maximum value = 0x00FF = unsigned 255)
//	0x95, 0x40,         // Report Count: Make sixty-four 8-bit fields (the next time the parser hits an "Input", "Output", or "Feature" item)
//    0x75, 0x08,         // Report Size: 8-bit field size
//    0x91, 0x02,         // Output (Data, Array, Abs): Instantiates output packet fields. Uses same report size and count as "Input" fields, since nothing new/different was specified to the parser since the "Input" item.
//    //33
//	0xC0                // End Collection

    0x05U, 0x81U, /* Usage Page (Vendor defined)*/
    0x09U, 0x82U, /* Usage (Vendor defined) */
    0xA1U, 0x01U, /* Collection (Application) */
    0x09U, 0x83U, /* Usage (Vendor defined) */
	// 8
    0x09U, 0x84U, /* Usage (Vendor defined) */
    0x15U, 0x80U, /* Logical Minimum (-128) */
    0x25U, 0x7FU, /* Logical Maximum (127) */
    0x75U, 0x08U, /* Report Size (8U) */
    0x95U, 0x08U, /* Report Count (8U) */
    0x81U, 0x02U, /* Input(Data, Variable, Absolute) */
    // 20
    0x09U, 0x84U, /* Usage (Vendor defined) */
    0x15U, 0x80U, /* Logical Minimum (-128) */
    0x25U, 0x7FU, /* Logical Maximum (127) */
    0x75U, 0x08U, /* Report Size (8U) */
    0x95U, 0x08U, /* Report Count (8U) */
    0x91U, 0x02U, /* Output(Data, Variable, Absolute) */
    // 32
    0xC0U,        /* End collection */
    
//    0x06, 0x00, 0xFF,   // Usage Page = 0xFF00 (Vendor Defined Page 1)
//	0x09, 0x01,         // Usage (Vendor Usage 1)
//	0xA1, 0x01,         // Collection (Application)
//    //7
//	0x19, 0x01,         // Usage Minimum
//	0x29, 0x40,         // Usage Maximum //64 input usages total (0x01 to 0x40)
//	0x15, 0x00,         // Logical Minimum (data bytes in the report may have minimum value = 0x00)
//	0x26, 0xFF, 0x00,   // Logical Maximum (data bytes in the report may have maximum value = 0x00FF = unsigned 255)
//	0x75, 0x08,         // Report Size: 8-bit field size
//	0x95, 0x40,         // Report Count: Make sixty-four 8-bit fields (the next time the parser hits an "Input", "Output", or "Feature" item)
//	0x81, 0x00,         // Input (Data, Array, Abs): Instantiates input packet fields based on the above report size, count, logical min/max, and usage.
//	//22
//    0x19, 0x01,         // Usage Minimum
//	0x29, 0x40,         // Usage Maximum //64 output usages total (0x01 to 0x40)
//	0x91, 0x00,         // Output (Data, Array, Abs): Instantiates output packet fields. Uses same report size and count as "Input" fields, since nothing new/different was specified to the parser since the "Input" item.
//	//28
//    0xC0                // End Collection
};
#endif
/* USB String Descriptors (optional) */
const uint8_t CustomHID_StringLangID[CUSTOMHID_SIZ_STRING_LANGID] =
  {
    CUSTOMHID_SIZ_STRING_LANGID,
    USB_STRING_DESCRIPTOR_TYPE,
    0x09,
    0x04
  }
  ; /* LangID = 0x0409: U.S. English */

const uint8_t CustomHID_StringVendor[CUSTOMHID_SIZ_STRING_VENDOR] =
  {
    CUSTOMHID_SIZ_STRING_VENDOR, /* Size of Vendor string */
    USB_STRING_DESCRIPTOR_TYPE,  /* bDescriptorType*/
    /* Manufacturer: "STMicroelectronics" */
    'S', 0, 'T', 0, 'M', 0, 'i', 0, 'c', 0, 'r', 0, 'o', 0, 'e', 0,
    'l', 0, 'e', 0, 'c', 0, 't', 0, 'r', 0, 'o', 0, 'n', 0, 'i', 0,
    'c', 0, 's', 0
  };

const uint8_t CustomHID_StringProduct[CUSTOMHID_SIZ_STRING_PRODUCT] =
  {
    CUSTOMHID_SIZ_STRING_PRODUCT,          /* bLength */
    USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
    'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, ' ', 0, 'C', 0,
    'u', 0, 's', 0, 't', 0, 'm', 0, ' ', 0, 'H', 0, 'I', 0,
    'D', 0
  };
uint8_t CustomHID_StringSerial[CUSTOMHID_SIZ_STRING_SERIAL] =
  {
    CUSTOMHID_SIZ_STRING_SERIAL,           /* bLength */
    USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
    'S', 0, 'T', 0, 'M', 0,'3', 0,'2', 0
  };

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

